﻿using System;
using System.Collections.Generic;
using System.Text;

namespace Datos
{
    /// <summary>
    /// Excepciones propias.
    /// </summary>
    public class DatosException : SystemException
    {
        public DatosException(string mensaje)
            :base(mensaje)
        {
        }
        
        public DatosException(string mensaje, string source)
            : base(mensaje)
        {
             this.Source = source;
        }

        public DatosException(string mensaje, Exception innerException)
            : base(mensaje, innerException)
        {
        }
        
        public DatosException(string mensaje, string source, Exception innerException)
            : base(mensaje, innerException)            
        { 
            this.Source = source; 
        }
    }

    /// <summary>
    /// Inserción de Claves Primarias repetidas.
    /// </summary>
    public class ClavePrimariaException : DatosException
    {
        public const int SQLNumberException = 26266;

        public ClavePrimariaException(string mensaje)
            : base(mensaje) 
        {
        }

        public ClavePrimariaException(string mensaje, string source) 
            : base(mensaje, source)
        { 
        }

        public ClavePrimariaException(string mensaje, Exception innerException)
            : base(mensaje, innerException)
        {
        }

        public ClavePrimariaException(string mensaje, string source, Exception innerException)
            : base(mensaje, source,innerException)            
        { 
        }
    }
    
    /// <summary>
    /// Violación de Claves Únicas.
    /// </summary>
    public class ClaveUnicaException : DatosException
    {
        public const int SQLNumberException = 2627;
                
        public ClaveUnicaException(string mensaje)
            : base(mensaje)
        { 
        }

        public ClaveUnicaException(string mensaje, string source)
            : base(mensaje,source)
        {
        }

        public ClaveUnicaException(string mensaje, Exception innerException)
            : base(mensaje, innerException)
        {
        }


        public ClaveUnicaException(string mensaje, string source, Exception innerException)
            : base(mensaje, source, innerException)            
        { 
        }
    }

    /// <summary>
    /// Violación de Clave Foránea.
    /// </summary>
    public class RelacionException : DatosException
    {
        public const int SQLNumberException = 262732;

        public RelacionException(string mensaje)
            : base(mensaje)
        {
        }

         public RelacionException(string mensaje, string source)
            : base(mensaje, source)
        {
        }

        public RelacionException(string mensaje, Exception innerException)
            : base(mensaje, innerException)
        {
        }


        public RelacionException(string mensaje, string source, Exception innerException)
            : base(mensaje, source, innerException)            
        { 
        }
    }

    /// <summary>
    /// Errores de programación.
    /// </summary>
    public class ErrorException : DatosException
    {
        public ErrorException(string mensaje)
            : base(mensaje)
        {
        }

        public ErrorException(string mensaje, string source)
            : base(mensaje,source)
        {
        }

        public ErrorException(string mensaje, Exception innerException)
            : base(mensaje, innerException)
        {
        }

        public ErrorException(string mensaje, string source, Exception innerException)
            : base(mensaje, source, innerException)            
        { 
        }

    }

    /// <summary>
    /// Inconsistencias a nivel de Negocio.
    /// </summary>
    public class InconsistenciaException : DatosException
    {
        List<string> errores;

        public InconsistenciaException() : base("") { }

        public InconsistenciaException(string mensaje) 
            : base(mensaje)
        {
        }
        
        public InconsistenciaException(string mensaje, string source)
            : base(mensaje, source)
        {
        }

        public InconsistenciaException(string mensaje, Exception innerException)
            : base(mensaje, innerException)
        {
        }

        public InconsistenciaException(String regla, string atributo, string source)
            : base(regla + ": " + atributo, source)
        {
        }

        public InconsistenciaException(string mensaje, string source, Exception innerException)
            : base(mensaje, source, innerException) 
        {
        }
        public void AgregarError(string regla, string campo)
        {
            AgregarError(regla + " " + campo);
        }

        public void AgregarError(string mensajeError)
        {
            if (errores == null) errores = new List<string>();
            errores.Add(mensajeError);
        }

        public void Lanzar()
        {
            if (errores != null && errores.Count > 0)
            {
                string mensaje = string.Empty;
                foreach (string err in errores)
                {
                    mensaje += err + "\r\n";
                }
                throw new InconsistenciaException(mensaje, this.Source);
            }
        } 
    }
}
